package cn.harry.cabinet.api.dto

import cn.harry.cabinet.api.enums.ExternalServiceType
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import java.util.Date

/**
 * 外部接口请求头
 */
@Serializable
@InternalSerializationApi
data class ExternalApiHeader(
    /**
     * 设备编号
     */
    val deviceNo: String,
    
    /**
     * 服务名称
     */
    val serviceName: String,
    
    /**
     * 请求时间，时间戳（毫秒）
     */
    val requestTime: Long
) {
    companion object {
        /**
         * 创建请求头
         * @param deviceNo 设备编号
         * @param serviceType 服务类型
         * @param requestTime 请求时间，默认为当前时间
         */
        fun create(
            deviceNo: String,
            serviceType: ExternalServiceType,
            requestTime: Date = Date()
        ): ExternalApiHeader {
            return ExternalApiHeader(
                deviceNo = deviceNo,
                serviceName = serviceType.serviceName,
                requestTime = requestTime.time
            )
        }
    }
}

/**
 * 外部接口请求体
 */
@Serializable
@InternalSerializationApi
data class ExternalApiRequest<T>(
    /**
     * 请求头
     */
    val header: ExternalApiHeader,
    
    /**
     * 请求体（JSON字符串）
     */
    val body: String
) {
    companion object {
        /**
         * 创建请求
         * @param deviceNo 设备编号
         * @param serviceType 服务类型
         * @param bodyData 请求体数据对象（将被序列化为JSON字符串）
         */
        inline fun <reified T> create(
            deviceNo: String,
            serviceType: ExternalServiceType,
            bodyData: T
        ): ExternalApiRequest<T> {
            val bodyJson = if (bodyData is String) {
                bodyData
            } else {
                Json.encodeToString(
                    kotlinx.serialization.serializer<T>(),
                    bodyData
                )
            }
            
            return ExternalApiRequest(
                header = ExternalApiHeader.create(deviceNo, serviceType),
                body = bodyJson
            )
        }
        
        /**
         * 创建空请求体的请求
         */
        fun createEmpty(
            deviceNo: String,
            serviceType: ExternalServiceType
        ): ExternalApiRequest<String> {
            return ExternalApiRequest(
                header = ExternalApiHeader.create(deviceNo, serviceType),
                body = ""
            )
        }
    }
}

/**
 * 外部接口响应
 */
@Serializable
@InternalSerializationApi
data class ExternalApiResponse<T>(
    /**
     * 响应码
     */
    val code: Int = 0,
    
    /**
     * 响应消息
     */
    val message: String = "",
    
    /**
     * 响应数据
     */
    val data: T? = null,
    
    /**
     * 是否成功
     */
    val success: Boolean = false
)

/**
 * 用户操作请求体
 * 参照 User 实体类
 */
@Serializable
@InternalSerializationApi
data class UserOperationBody(
    /**
     * 用户ID
     */
    val id: Long? = null,
    
    /**
     * 工号
     */
    val employeeId: String? = null,
    
    /**
     * 姓名
     */
    val name: String? = null,
    
    /**
     * 手机号
     */
    val phoneNumber: String? = null,
    
    /**
     * 岗位
     */
    val position: String? = null,
    
    /**
     * 性别 (MALE/FEMALE)
     */
    val gender: String? = null,
    
    /**
     * 状态 (ENABLED/DISABLED)
     */
    val status: String? = null,
    
    /**
     * 卡号
     */
    val cardNumber: String? = null,
    
    /**
     * 特征码
     */
    val featureCode: String? = null,
    
    /**
     * 密码
     */
    val password: String? = null,
)

/**
 * 识别记录请求体
 */
@Serializable
@InternalSerializationApi
data class RecognitionRecordBody(
    /**
     * 用户ID
     */
    val userId: Long,
    
    /**
     * 用户名
     */
    val userName: String,
    
    /**
     * 识别类型：face-人脸识别，card-刷卡
     */
    val recognitionType: String,
    
    /**
     * 识别时间
     */
    val recognitionTime: String,
    
    /**
     * 识别结果：success-成功，failed-失败
     */
    val result: String,
    
    /**
     * 置信度（人脸识别时使用）
     */
    val confidence: Float? = null,
    
    /**
     * 卡号（刷卡时使用）
     */
    val cardNumber: String? = null
)

/**
 * 物品操作记录请求体
 */
@Serializable
@InternalSerializationApi
data class ItemOperationRecordBody(
    /**
     * 用户ID
     */
    val userId: Long,
    
    /**
     * 用户名
     */
    val userName: String,
    
    /**
     * 操作类型：take-取物，return-还物
     */
    val operationType: String,
    
    /**
     * 操作时间
     */
    val operationTime: String,
    
    /**
     * 物品信息（可选）
     */
    val itemInfo: String? = null,
    
    /**
     * 备注
     */
    val remark: String? = null
)
